folium ๊ธฐ๋ณธ ์ง€์‹ ๊ณต์œ 

์ €์ž

lazychoi

๊ณต๊ฐœ

October 31, 2022

์„ค์น˜

  • ๊ณต์‹ ๋ฌธ์„œ
  • conda install folium -c conda-forge <- ์•„๋‚˜์ฝ˜๋‹ค ์‚ฌ์šฉ์ž ์ถ”์ฒœ
  • ๋˜๋Š” pip install folium

์ผ๋‹จ ์ง€๋„๋ฅผ ๋„์›Œ๋ณด์ž

์ฝ”๋“œ
import folium

m = folium.Map()
m
Make this Notebook Trusted to load map: File -> Trust Notebook

๋‚ด๊ฐ€ ์žˆ๋Š” ์œ„์น˜๋ฅผ ๋„์›Œ๋ณด์ž

์œ„๋„, ๊ฒฝ๋„ ๊ตฌํ•˜๊ธฐ

  • ๋‹ค๋ฅธ ๋‚˜๋ผ: ๊ตฌ๊ธ€๋งต์Šค์—์„œ ์šฐ์ธก ๋ฒ„ํŠผ์œผ๋กœ ํด๋ฆญํ•˜๋ฉด ๋ณด์ž„
  • ์šฐ๋ฆฌ๋‚˜๋ผ: ๊ตฌ๊ธ€์–ด์Šค ์ฃผ์†Œ์ฐฝ. geoplaner.com
  • ์ฃผ์†Œ -> ์œ„๊ฒฝ๋„: ๋‹ค์šธ์ฃผ์†Œ์ „ํ™˜์„œ๋น„์Šค

์ง€๋„ ํ‘œ์‹œ ์˜ต์…˜

  • location = [์œ„๋„, ๊ฒฝ๋„]
  • width, height ๊ธฐ๋ณธ๊ฐ’ 100%. pixel ๋‹จ์œ„๋กœ ์ž…๋ ฅ ๊ฐ€๋Šฅ
  • zoom_start ๊ธฐ๋ณธ๊ฐ’ 10, 0 ~ 18
์ฝ”๋“œ
m = folium.Map(location=[37.46854308,126.88626333], zoom_start=15, width=1024, height=600)
m
Make this Notebook Trusted to load map: File -> Trust Notebook

๋‚ด๊ฐ€ ์žˆ๋Š” ์œ„์น˜์— ๋งˆ์ปค ํ‘œ์‹œํ•˜๊ธฐ

์ฝ”๋“œ
m = folium.Map(location=[37.46854308,126.88626333], zoom_start=15)

folium.Marker([37.46854308,126.88626333]).add_to(m)

m
Make this Notebook Trusted to load map: File -> Trust Notebook

๋งˆ์ปค ์˜ต์…˜

Marker(location=None, popup=None, tooltip=None, icon=None, draggable=False, **kwargs)

  • popup: ๋งˆ์ปค ์ด๋ฆ„. ํด๋ฆญํ•˜๋ฉด ๋‚˜ํƒ€๋‚จ. html ํƒœ๊ทธ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • tooltip: ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ ธ์„ ๋•Œ ๋‚˜ํƒ€๋‚˜๋Š” ๋ฌธ์ž์—ด. html ํƒœ๊ทธ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • icon: ์•„์ด์ฝ˜ ๋ชจ์–‘, ์ƒ‰์ƒ. prefix=โ€˜faโ€™ ์„ค์ •ํ•˜๋ฉด fontawesome์˜ ์•„์ด์ฝ˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • draggable: True -> ๋งˆ์ปค๋ฅผ ์›€์ง์ผ ์ˆ˜ ์žˆ์Œ
์ฝ”๋“œ
m = folium.Map(location=[37.46854308,126.88626333], zoom_start=15)

folium.Marker([37.46854308,126.88626333], icon=folium.Icon(color='red', icon='car', prefix='fa'), popup='<h1>๋…์‚ฐ</h1>', tooltip='๋น…๋ฐ์ดํ„ฐ๋ฐ˜', draggable=True).add_to(m)

m
Make this Notebook Trusted to load map: File -> Trust Notebook

๋งˆ์ปค ์—ฌ๋Ÿฌ ๊ฐœ ์ถ”๊ฐ€ํ•˜๊ธฐ

์ฝ”๋“œ
m = folium.Map(location=[37.46854308,126.88626333], zoom_start=10)

folium.Marker([37.46854308,126.88626333], icon=folium.Icon(color='red', icon='car', prefix='fa'), popup='<h1>๋…์‚ฐ</h1>', tooltip='๋…์‚ฐ').add_to(m)
folium.Marker([37.55277,126.98969], icon=folium.Icon(color='red', icon='home', prefix='fa'), tooltip='๋‚จ์‚ฐ').add_to(m)
folium.Marker([37.57101,126.89623], icon=folium.Icon(color='red', icon='car', prefix='fa'), tooltip='๋งˆํฌ').add_to(m)
folium.Marker([37.50721,126.76684], icon=folium.Icon(color='red', icon='car', prefix='fa'), tooltip='๋ถ€์ฒœ').add_to(m)
m
Make this Notebook Trusted to load map: File -> Trust Notebook

์› ๋ชจ์–‘ ๋งˆ์ปค ๊ทธ๋ฆฌ๊ธฐ

  • Circle(location=None, radius=50, popup=None, tooltip=None, **kwargs)ยถ
์ฝ”๋“œ
m = folium.Map(location=[37.46854308,126.88626333], zoom_start=10)

folium.CircleMarker([37.46854308,126.88626333], radius=10, popup='<h1>๋…์‚ฐ</h1>', tooltip='10').add_to(m)
folium.CircleMarker([37.55277,126.98969], radius=30, tooltip='30').add_to(m)
folium.CircleMarker([37.57101,126.89623], radius=50, tooltip='50').add_to(m)
folium.CircleMarker([37.50721,126.76684], radius=70, tooltip='70').add_to(m)
m
Make this Notebook Trusted to load map: File -> Trust Notebook

ํ‘œ์‹œํ•  ๋งˆ์ปค๊ฐ€ 100๊ฐœ๋ผ๋ฉด ์–ด๋–ป๊ฒŒ ํ• ๊นŒ?

  • ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์— ์œ„๊ฒฝ๋„๋ฅผ ์ž…๋ ฅํ•œ ํ›„ for๋ฌธ์„ ์ด์šฉํ•ด ๋งˆ์ปค ์ฐ๊ธฐ
์ฝ”๋“œ
import pandas as pd

df = pd.read_csv('data/pet_man.csv')
df.head(3)
์‹œ๊ตฐ๋ช… ๋“ฑ๋ก๋™๋ฌผ์ˆ˜ ๋“ฑ๋ก์†Œ์œ ์ž์ˆ˜ ๊ด€๊ณต์„œ ์œ„๋„ ๊ฒฝ๋„ ์ด์ธ๊ตฌ์ˆ˜ 1000๋ช…๋‹น๋งˆ๋ฆฌ์ˆ˜ 1์†Œ์œ ์ž๋‹น๋งˆ๋ฆฌ์ˆ˜ ํ‰๊ท ์—ฐ๋ น ๋‚จ์žํ‰๊ท ์—ฐ๋ น ์—ฌ์žํ‰๊ท ์—ฐ๋ น
0 ๊ฐ€ํ‰๊ตฐ 4017 2006.0 ๊ฐ€ํ‰๊ตฐ์ฒญ 37.831318 127.509706 62168 64.62 2.00 50.3 49.1 51.6
1 ๊ณ ์–‘์‹œ 73477 54580.0 ๊ณ ์–‘์‹œ์ฒญ 37.658422 126.831964 1079277 68.08 1.35 42.9 42.0 43.9
2 ๊ณผ์ฒœ์‹œ 2974 2325.0 ๊ณผ์ฒœ์‹œ์ฒญ 37.429812 126.986963 78301 37.98 1.28 41.5 40.4 42.5

๊ด€๊ณต์„œ ์œ„์น˜์— ๋งˆ์ปค๋ฅผ ๋‹ฌ๊ณ  ํˆดํŒ์— ์‹œ๊ตฐ๋ช…๊ณผ ์ด์ธ๊ตฌ์ˆ˜๋ฅผ ํ‘œ์‹œํ•˜์ž.

์ฝ”๋“œ
m = folium.Map(
    location = [37.528043, 126.980238],
    zoom_start = 8)

lat = list(df['์œ„๋„'])
long = list(df['๊ฒฝ๋„'])
si = list(df['์‹œ๊ตฐ๋ช…'])
population = list(df['์ด์ธ๊ตฌ์ˆ˜'])

for i in range(len(lat)):
    folium.Marker(
            [lat[i], long[i]], tooltip=f'<b>{si[i]}</b><br>์ด์ธ๊ตฌ์ˆ˜: {str(population[i])}',
            icon=folium.Icon(color='red')
            ).add_to(m)

m
Make this Notebook Trusted to load map: File -> Trust Notebook

์ฝ”๋กœํ”Œ๋ ˆ์Šค ๋งต ๋งŒ๋“ค๊ธฐ

  • ์ค€๋น„๋ฌผ1: ํ–‰์ •๊ตฌ์—ญ๊ฒฝ๊ณ„ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด geojson ํŒŒ์ผ
  • ์ค€๋น„๋ฌผ2: ์ง€๋„์— ํ‘œ์‹œํ•  ๋ฐ์ดํ„ฐ(ํ–‰์ •๊ตฌ์—ญ๋ช…, ์ˆซ์ž)

์ค‘์š”!! ๋ฐ์ดํ„ฐ์˜ ํ–‰์ •๊ตฌ์—ญ๋ช…๊ณผ geojson ํŒŒ์ผ์˜ ํ–‰์ •๊ตฌ์—ญ๋ช…์ด ๊ฐ™์•„์•ผ ํ•จ

geojson ํŒŒ์ผ ๋ฐ›์€ ๊ณณ: ๋Œ€ํ•œ๋ฏผ๊ตญ ํ–‰์ •๋™ ๊ฒฝ๊ณ„ ํŒŒ์ผ

geojson ๋ฐ์ดํ„ฐ์— ๊ด€ํ•œ ์„ค๋ช…

geojson ํŒŒ์ผ ๊ตฌ์กฐ

{
"type": "FeatureCollection",
"name": "20220701",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{ "type": "Feature", "properties": { "OBJECTID": 1, "adm_nm": "์„œ์šธํŠน๋ณ„์‹œ ์ข…๋กœ๊ตฌ ์‚ฌ์ง๋™", "adm_cd": "1101053", "adm_cd2": "1111053000", "sgg": "11110", "sido": "11", "sidonm": "์„œ์šธํŠน๋ณ„์‹œ", "sggnm": "์ข…๋กœ๊ตฌ", "adm_cd8": "11010530" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 126.976888842748167, 37.575650779448786 ], [ 126.977034498877501, 37.569194530054553 ], [ 126.975974728212492, 37.569336299425764 ], [ 126.975374709912543, 37.569315567021562 ], [ 126.974331935623255, 37.569261800517531 ], [ 126.969048370018541, 37.568194417708334 ], [ 126.968544936033837, 37.568427679612761 ], [ 126.966649959821197, 37.569491655206583 ], [ 126.966281750244846, 37.569700734798701 ], [ 126.966097327080405, 37.569856509723699 ], [ 126.965728529225771, 37.570183936115114 ], [ 126.965926998221278, 37.570318805686199 ], [ 126.96601094018429, 37.571548395577466 ], [ 126.963659220521961, 37.575174660660373 ], [ 126.963086004345101, 37.576485920015543 ], [ 126.962840990511978, 37.57666158609274 ], [ 126.962810410472628, 37.579448809656775 ], [ 126.967424315843317, 37.579601537124489 ], [ 126.967421763026508, 37.579263521441646 ], [ 126.967430060184597, 37.579192577998604 ], [ 126.967457090095607, 37.578975250585437 ], [ 126.968066046996256, 37.578246780467872 ], [ 126.968955116954774, 37.577935262340283 ], [ 126.969212842969057, 37.577935299309388 ], [ 126.969414538865792, 37.578121124142164 ], [ 126.969664426694706, 37.578531136682209 ], [ 126.969667219148718, 37.578736205134931 ], [ 126.969668773533087, 37.578992879009881 ], [ 126.969669499103631, 37.57911252674959 ], [ 126.969904573616262, 37.579301753628734 ], [ 126.97135197544759, 37.57951327793981 ], [ 126.973819257844539, 37.579372140302631 ], [ 126.973917363383421, 37.578487073041011 ], [ 126.973939619980882, 37.578240429978088 ], [ 126.974331538357575, 37.575749906299862 ], [ 126.975803789978045, 37.575649468824203 ], [ 126.976888842748167, 37.575650779448786 ] ] ] ] } },
]}

folium.Choropleth() ํ•จ์ˆ˜ ํ™œ์šฉ

  • ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•์€ ๋งˆํ„ฐ ์ถ”๊ฐ€์™€ ๊ฐ™๋‹ค. folium.Choropleth().add_to(m)
  • geo_data: geojson ํŒŒ์ผ์„ ์ €์žฅํ•œ ๋ณ€์ˆ˜
  • data = ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ๋ณ€์ˆ˜
  • columns = [โ€˜ํ‚คโ€™, โ€˜๊ฐ’โ€™]
  • key_on = geojson ํŒŒ์ผ์—์„œ ์‹œ๊ตฐ๋ช…์˜ ํ‚ค ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค. ์š” ๋ถ€๋ถ„์€ ์ •ํ™•ํ•˜๊ฒŒ ๋ชจ๋ฅด๊ฒ ๋‹ค. ์‹œ๊ตฐ๋ช…์€ sggnm ํ‚ค์— ์ €์žฅ๋˜์–ด ์žˆ์œผ๋‹ˆ sggnm ๋ถ€ํ„ฐ ์ƒ์œ„ ๊ฒฝ๋กœ๋ฅผ ์ ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ์ ์œผ๋ฉด ๋  ๊ฒƒ ๊ฐ™์€๋ฐ features๊ฐ€ ์•„๋‹ˆ๋ผ feature๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒŒ ์ด์ƒํ•˜๋‹ค.
  • fill_color = ์ƒ‰์ƒ์„ ์ ๋Š”๋‹ค.
  • fill_opacity = ํˆฌ๋ช…๋„๋ฅผ ์ง€์ •ํ•œ๋‹ค.
  • line_opacity = ํ–‰์ •๊ฒฝ๊ณ„์„ ์˜ ํˆฌ๋ช…๋„๋ฅผ ์ง€์ •ํ•œ๋‹ค.
  • legend_name = ๋ฒ”๋ก€ ํƒ€์ดํ‹€์„ ์ž…๋ ฅํ•œ๋‹ค.

folium.LayerControl()์€ ์—†์–ด๋„ ์ž‘๋™์„ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋นผ๋„ ๋  ๊ฒƒ ๊ฐ™๋‹ค.

์ฝ”๋“œ
import json

m = folium.Map(
    location = [37.528043, 126.980238],
    zoom_start = 8)

lat = list(df['์œ„๋„'])
long = list(df['๊ฒฝ๋„'])
name = list(df['๋“ฑ๋ก๋™๋ฌผ์ˆ˜'])
si = list(df['์‹œ๊ตฐ๋ช…'])

for i in range(len(lat)):
    folium.Marker(
            [lat[i], long[i]], tooltip=f'<b>{si[i]}</b><br>๋ฐ˜๋ ค๋™๋ฌผ์ˆ˜: {str(name[i])}',
            icon=folium.Icon(color='red')
            ).add_to(m)

    
geo_data = json.load(open('data/HangJeongDong_ver20220701.geojson', encoding='UTF8'))

folium.Choropleth(
    geo_data = geo_data,
    data = df,
    columns= ['์‹œ๊ตฐ๋ช…', '๋“ฑ๋ก๋™๋ฌผ์ˆ˜'],
    key_on = 'feature.properties.sggnm',
    fill_color = 'Reds',
    fill_opacity = 0.7,
    line_opacity = 0.4,
    legend_name = '์‹œ๊ตฐ๋ณ„ ๋“ฑ๋ก ๋ฐ˜๋ ค๋™๋ฌผ์ˆ˜(๋งˆ๋ฆฌ))'
).add_to(m)

folium.LayerControl().add_to(m)

m
Make this Notebook Trusted to load map: File -> Trust Notebook

์œ„์—์„œ ๊นŒ๋งฃ๊ฒŒ ํ‘œ์‹œ๋˜๋Š” ์ด์œ ๋Š” geojson ํŒŒ์ผ์— ์žˆ๋Š” ํ–‰์ •๊ตฌ์—ญ๋ช…์นญ์ด ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์˜ โ€˜์‹œ๊ตฐ๋ช…โ€™ ์ปฌ๋Ÿผ์—๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ geojson ํŒŒ์ผ์„ ํŽธ์ง‘ํ•˜์—ฌ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์— ์žˆ๋Š” โ€™์‹œ๊ตฐ๋ช…โ€™๋งŒ ๋‚จ๊ธฐ๊ณ  ์‚ญ์ œํ•œ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํŽธ์ง‘ํ•œ ํŒŒ์ผ์ด โ€™kyeong.geojsonโ€™์ด๋‹ค. ์ด ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์™€์„œ ๋‹ค์‹œ ์ง€๋„๋ฅผ ๋„์šฐ์ž

์ฃผ์˜!!! geojson ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ cp949 ์ธ์ฝ”๋”ฉ ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿด ๋•Œ๋Š” ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ open() ํ•จ์ˆ˜ ์•ˆ์— encoding=โ€˜utf8โ€™ ์˜ต์…˜์„ ๋„ฃ๋Š”๋‹ค.

์ฝ”๋“œ
import json

m = folium.Map(
    location = [37.528043, 126.980238],
    zoom_start = 8)

lat = list(df['์œ„๋„'])
long = list(df['๊ฒฝ๋„'])
name = list(df['๋“ฑ๋ก๋™๋ฌผ์ˆ˜'])
si = list(df['์‹œ๊ตฐ๋ช…'])

for i in range(len(lat)):
    folium.Marker(
            [lat[i], long[i]], tooltip=f'<b>{si[i]}</b><br>๋ฐ˜๋ ค๋™๋ฌผ์ˆ˜: {str(name[i])}',
            icon=folium.Icon(color='red')
            ).add_to(m)

    
geo_data = json.load(open('data/kyeong.geojson', encoding='UTF8'))

folium.Choropleth(
    geo_data = geo_data,
    data = df,
    columns= ['์‹œ๊ตฐ๋ช…', '๋“ฑ๋ก๋™๋ฌผ์ˆ˜'],
    key_on = 'feature.properties.sggnm',
    fill_color = 'Reds',
    fill_opacity = 0.7,
    line_opacity = 0.4,
    legend_name = '์‹œ๊ตฐ๋ณ„ ๋“ฑ๋ก ๋ฐ˜๋ ค๋™๋ฌผ์ˆ˜(๋งˆ๋ฆฌ))'
).add_to(m)

# folium.LayerControl().add_to(m)

m
Make this Notebook Trusted to load map: File -> Trust Notebook

์™„์„ฑ!!!